home *** CD-ROM | disk | FTP | other *** search
/ Power CD / Power CD ATARI-Rechner Lieben.iso / UTILITY / MIDI8031 / OS.S51 < prev    next >
Encoding:
Text File  |  1987-04-21  |  6.0 KB  |  278 lines

  1. ;********************************************************
  2. ;* MIDI8031, Mini-OS fuer EPROM, (C) JP 1992            *
  3. ;* Juergen Piscol, Rastatterstr. 144, 7500 Karlsruhe 51 *
  4. ;********************************************************
  5.  
  6.     .registers reg51.inc        ; 8051 SF-Register
  7.  
  8.     .text_org $0                ; EPROM-Bereich
  9.  
  10. ; ----- Interruptbereich -----
  11.  
  12. reset:    ljmp start
  13. int0:    ljmp $8003
  14.         .ds.b 5
  15. timer0:    ljmp $800b
  16.         .ds.b 5
  17. int1:    ljmp $8013
  18.         .ds.b 5
  19. timer1:    ljmp $801b
  20.         .ds.b 5
  21. serial:    jnb PSW.5,?ose        ; F0=0: MIDI abfangen         
  22.         ljmp $8023            ; F1=1: USER-MIDI
  23. ?ose:    ajmp midio
  24.  
  25. ; ----- EPROM-Info -----
  26.  
  27.     .dc.b "+++++++++++++++++++++++++++++++++++++++"
  28.     .dc.b " MIDI8031 / 12MHz / (C) JP 1992 / V2.0 "
  29.     .dc.b "+++++++++++++++++++++++++++++++++++++++"
  30.  
  31. ; ----- Initialisierung der Hardware -----
  32.  
  33. start:
  34.     mov SP,#$2F                ; SP oberhalb Bitbereich
  35.     mov    TMOD,#%00100000        ; Timer 1 Baudrate, Timer 2 aus
  36.     mov    TCON,#%01000000        ; Timer 1 laeuft...
  37.     mov    TH1,#$FF            ; Timer 1 Reload fuer Baudrate 31250
  38.     mov    SCON,#%01111100        ; Ini. Schnittstelle
  39.     mov    IP,#%00010000        ; Nur Ser. Int. Hohe Prioritaet
  40.  
  41.     mov R1,#20
  42. ?s1: cpl P3.5                ; LED Flackern- Reset
  43.     mov A,#30                ; ca. 0.6 sec warten
  44.     acall wait_ams            ; A ms warten...
  45.     djnz R1,?s1
  46.  
  47.     clr SCON.1                ; RI=0 Nix Interrupt!
  48.     clr SCON.0                ; TI=0 dto.
  49.     mov    IE,#%10010000        ; Nur Ser. Interrupt zulassen
  50.  
  51. ; ----- Hauptwarteschleife -----
  52.  
  53. main:
  54.     mov R1,#200                ; R1: Zeitkonstante
  55. ?ma1: mov A,R1
  56.     acall wait_ams            ; warten
  57.     cpl P3.5                ; LED toggeln
  58.     sjmp ?ma1                ; u. das gleiche nochmal
  59.  
  60. ; ----- wait ams: Wartet Anz. msec (ca.) in A, Reg.: A,R0 -----
  61.  
  62. wait_ams:
  63.     mov R0,#248                ; so in etwa 1 ms.
  64. ?w1:
  65.     nop
  66.     nop
  67.     djnz R0,?w1
  68.     djnz ACC,wait_ams
  69.     ret
  70.  
  71. ; ----- cha_out: Zeichen in A ueber MIDI ausg., Reg.: A -----
  72. cha_out:
  73.     mov C,SCON.1            ; TI merken
  74.     clr SCON.1                ; und loeschen
  75.  
  76.     mov SBUF,A                ; Zeichen absetzen
  77.     jnb SCON.1,!            ; TI=1 abwarten
  78.  
  79.     mov SCON.1,C            ; und alter Zustand
  80.     ret
  81.  
  82. ; ----- cha_in: Zeichen von MIDI abholen nach A., Reg.: A -----
  83.  
  84. cha_in:
  85.     jnb SCON.0,!            ; RI=1 abwarten
  86.     clr SCON.0                ; quittieren
  87.     mov A,SBUF
  88.     ret
  89.  
  90. ; ----- xbkl_out: XRAM-Block @DPTR, Laenge R0 absenden, Reg.: DPTR,R0
  91. xblk_out:
  92.     movx A,@DPTR            ; Byte holen
  93.     acall cha_out            ; Byte ausgeben
  94.     inc DPTR                ; Speicher weiter...
  95.     djnz R0,xblk_out        ; bis fertig!
  96.     ret
  97.  
  98. ; ----- xbkl_in: XRAM-Block @DPTR, Laenge R0 einlesen, Reg.: DPTR,R0
  99.  
  100. xblk_in:
  101.     acall cha_in            ; Byte holen
  102.     movx @DPTR,A            ; Byte poken
  103.     inc DPTR                ; Speicher weiter...
  104.     djnz R0,xblk_in            ; bis fertig!
  105.     ret
  106.  
  107. ; ----- rbkl_out: RAM-Block @R1, Laenge R0 absenden, Reg.: R1,R0
  108.  
  109. rblk_out:
  110.     mov A,@R1                ; Byte holen
  111.     acall cha_out            ; Byte ausgeben
  112.     inc R1                    ; Speicher weiter...
  113.     djnz R0,rblk_out        ; bis fertig!
  114.     ret
  115.  
  116. ; ----- rbkl_in: RAM-Block @R1, Laenge R0 einlesen, Reg.: R1,R0
  117. rblk_in:
  118.     acall cha_in            ; Byte holen
  119.     mov @R1,A                ; Byte poken
  120.     inc R1                    ; Speicher weiter...
  121.     djnz R0,rblk_in            ; bis fertig!
  122.     ret
  123.  
  124. ; ----- Midi-Interrupt -----
  125.  
  126. ?m0:
  127.     mov A,#109                ; //109// Single-Step
  128.     acall cha_out            ; 109 ausgeben, aber
  129.     mov A,#104                ; 104 merken
  130.     sjmp ?mm1                ; ausgeben und weiter...
  131. midio:
  132.  
  133.     push PSW                ; Flags sichern
  134.     push ACC                ; Register sichern!
  135.     mov A,R0
  136.     push ACC
  137.     mov A,R1
  138.     push ACC
  139.     push DPL
  140.     push DPH
  141.     jb SCON.1,?m0            ; evtl. TI: Single-Step
  142.  
  143. mid_com:                    ; Kommando holen
  144.     acall cha_in            ; Zeichen holen
  145.     acall cha_out            ; Quittieren...
  146. ?mm1:
  147.  
  148.     cjne A,#100,?m1            ; //100//: XRAM Block senden?
  149.     acall cha_in
  150.     mov DPL,A                ; Source_Low
  151.     acall cha_in
  152.     mov DPH,A                ; Source_High
  153.     acall cha_in
  154.     mov R0,A                ; Laenge
  155.     acall xblk_out
  156.     sjmp mid_com
  157.  
  158. ?m1:
  159.     cjne A,#101,?m2            ; //101//: XRAM Block empfangen?
  160.     acall cha_in
  161.     mov DPL,A                ; Destin_Low
  162.     acall cha_in
  163.     mov DPH,A                ; Destin_High
  164.     acall cha_in
  165.     mov R0,A                ; Laenge
  166.     acall xblk_in
  167.     sjmp mid_com
  168.  
  169. ?m2:
  170.     cjne A,#102,?m3            ; //102//: Block senden?
  171.     acall cha_in
  172.     mov R1,A                ; Source
  173.     acall cha_in
  174.     mov R0,A                ; Laenge
  175.     acall rblk_out
  176.     sjmp mid_com
  177.  
  178. ?m3:
  179.     cjne A,#103,?m4            ; //103//: Block empfangen?
  180.     acall cha_in
  181.     mov R1,A                ; Destin.
  182.     acall cha_in
  183.     mov R0,A                ; Laenge
  184.     acall rblk_in
  185.     sjmp mid_com
  186.  
  187. ?m4:
  188.     cjne A,#104,?m5            ; //104//: PC ausg. u. warten (BREAK in ...)
  189.     mov A,SP                ; A aus SP holen
  190.     add A,#-6                ; 6 Bytes weniger (DPL/H R1 R0 ACC PSW)
  191.     mov R0,A                ; R0=SP-7
  192.     mov A,@R0
  193.     acall cha_out            ; PC_High ausg.
  194.     dec R0
  195.     mov A,@R0
  196.     acall cha_out            ; PC_Low ausg.
  197.     sjmp mid_com            ; weiter warten...
  198.  
  199. ?m5:
  200.     cjne A,#105,?m6            ; //105//: PC setzen (GO ...)
  201.  
  202.     mov A,SP                ; A aus SP holen
  203.     add A,#-6                ; 6 Bytes weniger (DPL/H R1 R0 ACC PSW)
  204.     mov R0,A                ; R0=SP-7
  205.  
  206.     acall cha_in            ; High-Byte PC
  207.     mov @R0,A
  208.     dec R0
  209.     acall cha_in            ; Low-Byte PC
  210.     mov @R0,A
  211.     sjmp ?mx                ; EXIT, Schleife verlassen!
  212.  
  213. ?m6:
  214.     cjne A,#106,?m7            ; //106//: Interrupts abschalten (INIT)
  215.     mov    IE,#%10010000        ; Nur Ser. Interrupt zulassen
  216.     mov    IP,#%00010000        ; Nur Ser. Int. Hohe Prioritaet
  217.     sjmp mid_com            ; weiter warten...
  218.  
  219. ?m7:
  220.     cjne A,#107,?m8            ; //107// Single Step ON
  221.     setb SCON.1                ; TI = ON
  222.     sjmp mid_com
  223.  
  224. ?m8:
  225.     cjne A,#108,?m10        ; //108// Single Step OFF
  226.     clr SCON.1                ; TI = OFF
  227.     sjmp mid_com
  228.  
  229. ?m10:
  230.     cjne A,#110,?mx            ; //110//: wichtige Register lesen
  231.     mov R0,SP                ; R0 aus SP
  232.     mov A,@R0
  233.     acall cha_out            ; DPL
  234.     dec R0
  235.     mov A,@R0
  236.     acall cha_out            ; DPH
  237.     dec R0
  238.     mov A,R7
  239.     acall cha_out            ; R7
  240.     mov A,R6
  241.     acall cha_out            ; R6
  242.     mov A,R5
  243.     acall cha_out            ; R5
  244.     mov A,R4
  245.     acall cha_out            ; R4
  246.     mov A,R3
  247.     acall cha_out            ; R3
  248.     mov A,R2
  249.     acall cha_out            ; R2
  250.     mov A,@R0
  251.     acall cha_out            ; R1
  252.     dec R0
  253.     mov A,@R0
  254.     acall cha_out            ; R0
  255.     dec R0
  256.     mov A,@R0
  257.     acall cha_out            ; ACC
  258.     dec R0
  259.     mov A,@R0
  260.     acall cha_out            ; PSW
  261.     mov A,SP
  262.     add A,#-6                
  263.     acall cha_out            ; SP (excl. Debugger, 6 zuwenig!)
  264.     mov A,B
  265.     acall cha_out            ; B
  266.     ajmp mid_com            ; weiter warten...
  267.  
  268. ?mx:                        ; Andere Daten: Schleife verlassen
  269.     pop DPH
  270.     pop DPL
  271.     pop ACC
  272.     mov R1,A
  273.     pop ACC
  274.     mov R0,A
  275.     pop ACC
  276.     pop PSW
  277.     reti                    ; Fertig!
  278.